package com.tyros.common.secure.symmetrics;

import java.security.Provider;

/**
 * 对称加密算法
 *
 * @author zsy
 */
public interface Symmetric {

    /**
     * 解密
     *
     * @param cipher     密文
     * @param password   密钥
     * @param salt       盐值
     * @param additional 附加内容
     * @param provider   解密提供商
     * @return 明文 byte[]
     */
    byte[] decrypt(byte[] cipher, byte[] password, byte[] additional, byte[] salt, Provider provider);


    /**
     * 解密
     *
     * @param cipher   密文
     * @param password 密码
     * @return 明文 byte[]
     */
    default byte[] decrypt(byte[] cipher, byte[] password) {
        return decrypt(cipher, password, null, null, null);
    }

    /**
     * 解密
     *
     * @param cipher     原始内容
     * @param password   密码
     * @param salt       盐值
     * @param additional 附加内容
     * @return 明文 byte[]
     */
    default byte[] decrypt(byte[] cipher, byte[] password, byte[] salt, byte[] additional) {
        return decrypt(cipher, password, additional, salt, null);
    }


    /**
     * 加密
     *
     * @param raw        原始内容
     * @param password   密码
     * @param salt       盐值/随机值
     * @param additional 附加值
     * @param provider   加密提供商
     * @return 密文 byte[]
     */
    byte[] encrypt(byte[] raw, byte[] password, byte[] additional, byte[] salt, Provider provider);


    /**
     * 加密,使用随机盐值
     *
     * @param raw      原始内容
     * @param password 密码
     * @return 密文 byte[]
     */
    default byte[] encrypt(byte[] raw, byte[] password) {
        return encrypt(raw, password, null, null, null);
    }
}
